
import jsonwebtoken from 'jsonwebtoken'
import config from '@/config/index'
import { checkCode } from '@/common/Util'
import UserModel from '@/model/user'
import bcrypt from 'bcrypt'
import moment from 'moment'

class LoginController {
  // eslint-disable-next-line no-useless-constructor
  constructor () { }
  // 登录
  async login (ctx) {
    // 接收用户的数据
    // 验证图片验证码的时效性、正确性
    // 验证用户账号密码是否正确
    // 返回 Token
    const { body } = ctx.request
    const sid = body.sid
    const code = body.code
    // 校验验证码的时效性、正确性
    const codeValidate = await checkCode(sid, code)
    if (codeValidate) {
      // 校验登录用户名、密码的正确性
      let userValidate = false
      const user = await UserModel.findOne({ username: body.username })
      if (await bcrypt.compare(body.password, user.password)) {
        userValidate = true
      }
      // MongoDB 查库
      if (userValidate) {
        // 验证通过返回 token
        // 过期时间设置为1天
        // Date.now() 获取当前时间戳
        const token = jsonwebtoken.sign({
          _id: 'zh'
          // exp: Math.floor(Date.now() / 1000) + 60 * 60 * 24
        },
        config.JWT_SECRET,
        { expiresIn: '1d' }
        )
        ctx.body = {
          code: 200,
          token: token
        }
      } else {
        // 用户名、密码验证失败
        ctx.body = {
          code: 404,
          msg: '用户名或密码错误'
        }
      }
    } else {
      // 图片验证码校验失败
      ctx.body = {
        code: 401,
        msg: '图片验证码不正确，请检查！'
      }
    }
  }

  // 注册
  async reg (ctx) {
    // 接受客户端参数
    const { body } = ctx.request
    // 校验验证码内容（时效性、正确性）
    const sid = body.sid
    const code = body.code
    const msg = {}
    let check = true
    const codeValidate = await checkCode(sid, code)
    if (codeValidate) {
      // 查库，看 username 是否被注册
      const user1 = await UserModel.findOne({ username: body.username })
      if (user1 && typeof user1.username !== 'undefined') {
        msg.username = ['此邮箱已注册, 可通过邮箱找回密码']
        check = false
      }
      // 查库，看 name 是否被注册
      const user2 = await UserModel.findOne({ name: body.name })
      if (user2 && typeof user2.name !== 'undefined') {
        msg.name = ['此昵称已注册, 请修改']
        check = false
      }
      // 写入数据到数据库
      if (check) {
        body.password = await bcrypt.hash(body.password, 5)
        const user = new UserModel({
          username: body.username,
          name: body.name,
          password: body.password,
          created: moment().format('YYYY-MM-DD HH:mm:ss')
        })
        const result = user.save()
        ctx.body = {
          code: 200,
          data: result,
          msg: '注册成功!'
        }
        return
      }
    } else {
      // 用于 veevalidate 显示错误信息
      msg.code = ['验证码已失效, 请重新获取!']
    }
    ctx.body = {
      code: 500,
      msg: msg
    }
  }
}
export default new LoginController()
